package main

import "fmt"

// main
//
//	@Description: 代理模式：代理模式，为其他对象提供一种代理以控制对这个对象的访问。
//
// 通过组合而不是继承来实现代码的复用和扩展
func main() {

	bh := &BuyHouseProxy{
		buyHouse: &BuyHouseImpl{},
	}
	bh.Buy("小明", 10000)
	bh.Sell("小明", 11000)
}

type BuyHouse interface {
	Buy(name string, money float32)
	Sell(name string, money float32)
}

type BuyHouseImpl struct {
}

func (b *BuyHouseImpl) Buy(name string, money float32) {
	fmt.Printf("%s 买房子，最后价格为:%f \n", name, money)
}

func (b *BuyHouseImpl) Sell(name string, money float32) {
	fmt.Printf("%s 卖房子，最后价格为:%f \n", name, money)
}

// BuyHouseProxy
// @Description: 代理
type BuyHouseProxy struct {
	buyHouse BuyHouse
}

// Buy
//
//	@Description: 实现方法：Buy
//	@receiver bh
//	@param name
//	@param money
func (bh *BuyHouseProxy) Buy(name string, money float32) {
	fmt.Printf("%s 买房子，房价为：%f,还需要中介费1成 \n", name, money)
	money = money * 1.1
	bh.buyHouse.Buy(name, money)
	fmt.Println("购房各项手续完成---")
}

// Sell
//
//	@Description: 实现方法：Sell
//	@receiver bh
//	@param name
//	@param money
func (bh *BuyHouseProxy) Sell(name string, money float32) {
	fmt.Printf("%s 卖房子，房价为：%f,还需要涨价2成 \n", name, money)
	money = money * 1.2
	bh.buyHouse.Sell(name, money)
	fmt.Println("卖房各项手续完成---")
}
